home *** CD-ROM | disk | FTP | other *** search
/ Aminet 44 / Aminet 44 (2001)(GTI - Schatztruhe)[!][Aug 2001].iso / Aminet / comm / misc / Camedia.lha / Camedia / Camedia.c < prev    next >
C/C++ Source or Header  |  2001-06-07  |  38KB  |  1,605 lines

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <time.h>
  5.  
  6. #include <dos/dos.h>
  7. #include <exec/exec.h>
  8. #include <devices/serial.h>
  9.  
  10. //#include <clib/exec_protos.h>    // TetiSoft
  11. //#include <clib/dos_protos.h>    // TetiSoft
  12. #include <proto/exec.h>        // TetiSoft
  13. #include <proto/dos.h>        // TetiSoft
  14.  
  15. #include <clib/alib_protos.h>
  16.  
  17. //#include <pragma/dos_lib.h>    // TetiSoft
  18. //#include <pragma/exec_lib.h>    // TetiSoft
  19.  
  20. #include "Camedia.h"
  21.  
  22. __inline void read_L1(L1 *, char* error_msg);    // TetiSoft: Moved from Camedia.h
  23. __inline void send_L1(L1, char* error_msg);    // TetiSoft: Moved from Camedia.h
  24. __inline void send_L2(L2, char* error_msg);    // TetiSoft: Moved from Camedia.h
  25. __inline L2 checksum(L1 *, L1 *);        // TetiSoft: Moved from Camedia.h
  26.  
  27. struct MsgPort  *SerialMP=NULL;
  28. struct MsgPort  *TimerMP=NULL;
  29. struct IOExtSer *SerialIO=NULL;
  30. struct timerequest *TimerIO=NULL;
  31.  
  32. ULONG WaitMask;
  33. int get_preview=0;
  34. int first_Packet=1;
  35. char error_msg_buffer[256];
  36.  
  37. void clean(int entrypoint) {
  38.     switch(entrypoint) {
  39.         case 100:
  40.         case 101:
  41.             if (TimerIO) {
  42.             CloseDevice((struct IORequest *) TimerIO);
  43.         }
  44.         case 102:
  45.             if (SerialIO) {
  46.                 CloseDevice((struct IORequest *) SerialIO);
  47.             }
  48.         case 103:
  49.             if (TimerIO) {
  50.                 DeleteExtIO((struct IORequest *) TimerIO);
  51.                 TimerIO=NULL;
  52.             }
  53.         case 104:
  54.             if (SerialIO) {
  55.                 DeleteExtIO((struct IORequest *) SerialIO);
  56.                 SerialIO=NULL;
  57.             }
  58.         case 105:
  59.             if (TimerMP) {
  60.                 DeletePort(TimerMP);
  61.                 TimerMP=NULL;
  62.             }
  63.         case 106:
  64.             if (SerialMP) {
  65.                 DeletePort(SerialMP);
  66.                 SerialMP=NULL;
  67.             }
  68.     };
  69. }
  70.  
  71.  
  72. void bootstrap(char *serial_device, int unit, char* error_msg) {
  73.     SerialMP=CreatePort(0,0);
  74.     if (!SerialMP) {
  75.         strcpy(error_msg, "Couldn't do CreateMsgPort() for SerialMP");
  76.         return;
  77.     }
  78.     
  79.     TimerMP=CreatePort(0,0);
  80.     if (!SerialMP) {
  81.         clean(106);
  82.         strcpy(error_msg, "Couldn't do CreateMsgPort() for TimerMP");
  83.         return;
  84.     }
  85.     
  86.     if (!(SerialIO = (struct IOExtSer *) CreateExtIO(SerialMP, sizeof(struct IOExtSer)))) {
  87.         clean(105);
  88.         strcpy(error_msg, "Couldn't do CreateExtIO() for SerialIO");
  89.         return;
  90.     }
  91.     
  92.     if (!(TimerIO = (struct timerequest *) CreateExtIO(TimerMP, sizeof(struct timerequest)))) {
  93.         clean(104);
  94.         strcpy(error_msg, "Couldn't do CreateExtIO() for TimerIO");
  95.         return;
  96.     }
  97.     
  98.     if (OpenDevice(serial_device, (ULONG) unit, (struct IORequest *) SerialIO, 0)) {
  99.         sprintf(error_msg_buffer, "Error, couldn't open %s, unit %d", serial_device, unit);
  100.         clean(103);
  101.         strcpy(error_msg, error_msg_buffer);
  102.         return;
  103.     }
  104.     
  105.     SerialIO->io_RBufLen=2060;
  106.     SerialIO->io_SerFlags &=SERF_XDISABLED | SERF_RAD_BOOGIE;
  107.     SerialIO->IOSer.io_Command = SDCMD_SETPARAMS;
  108.     if (DoIO((struct IORequest *)SerialIO)) {
  109.         sprintf(error_msg_buffer, "Error, couldn't set the read buffer from %s, unit %d to 2060 bytes", serial_device, unit);
  110.         clean(103);
  111.         strcpy(error_msg, error_msg_buffer);
  112.         return;
  113.     }
  114.     
  115.     
  116.     if (OpenDevice(TIMERNAME, UNIT_VBLANK, (struct IORequest *) TimerIO, 0L)) {
  117.         clean(102);
  118.         strcpy(error_msg, "Error, couldn't open timer device");
  119.         return;
  120.     }
  121.  
  122.     WaitMask=SIGBREAKF_CTRL_C | SIGBREAKF_CTRL_F| 1L<<SerialMP->mp_SigBit | 1L<<TimerMP->mp_SigBit;
  123. }
  124.  
  125. void SetSerialSpeed(enum Camera_Speed cam_speed, char* error_msg ) {
  126.     long computer_speed;
  127.     
  128.     switch(cam_speed) {
  129.         case CAMERA_SPEED_9600:
  130.             computer_speed=9600;
  131.             break;
  132.             
  133.         case CAMERA_SPEED_19200:
  134.         case CAMERA_SPEED_INIT:
  135.             computer_speed=19200;
  136.             break;
  137.             
  138.         case CAMERA_SPEED_38400:
  139.             computer_speed=38400;
  140.             break;
  141.             
  142.         case CAMERA_SPEED_57600:
  143.             computer_speed=57600;
  144.             break;
  145.             
  146.         case CAMERA_SPEED_115200:
  147.             computer_speed=115200;
  148.             break;
  149.         
  150.         case CAMERA_SPEED_230400:    // Added by TetiSoft
  151.             computer_speed=230400;    // Added by TetiSoft
  152.             break;            // Added by TetiSoft
  153.         
  154.         default:
  155.             strcpy(error_msg, "Unknown Camera speed");
  156.             return;
  157.     }
  158.     
  159.     SerialIO->io_Baud=computer_speed;
  160.     SerialIO->IOSer.io_Command = SDCMD_SETPARAMS;
  161.     if (DoIO((struct IORequest *)SerialIO)) strcpy(error_msg, "Error in SetSerialSpeed");
  162. }
  163.  
  164. void init(enum Camera_Speed cs, char* error_msg ) {
  165.     L1 r;
  166.     int retry=0;
  167.  
  168.     while (retry<MAX_RETRIES) {
  169.  
  170.         SetSerialSpeed(CAMERA_SPEED_INIT, error_msg);
  171.         if (*error_msg!=0) goto init_catch;
  172.         // check speed
  173.         send_L1(Computer_Initialization_Byte, error_msg);
  174.         if (*error_msg!=0) goto init_catch;
  175.         
  176.         read_L1(&r, error_msg);
  177.         if (*error_msg!=0) goto init_catch;
  178.         if (r==Camera_Signature) {
  179.             Set_Comm_Speed(cs, error_msg);
  180.             if (*error_msg!=0) goto init_catch;
  181.             return;
  182.         }                
  183.     
  184.     init_catch:
  185.         printf("got error in init: %s\n", error_msg);
  186.         retry++;
  187.         error_msg[0]='\0';    // TetiSoft: We must clear this before trying again...
  188.         Delay(200);
  189.     }
  190.     strcpy(error_msg, "Couldn't do init");
  191. }
  192.  
  193.  
  194. void send(L1 *cb, long length, char* error_msg) {
  195.     ULONG result;
  196.     
  197.     SerialIO->IOSer.io_Length  = length;
  198.     SerialIO->IOSer.io_Data    = (APTR) cb;
  199.     SerialIO->IOSer.io_Command = CMD_WRITE;
  200.     
  201.     TimerIO->tr_node.io_Command = TR_ADDREQUEST;
  202.     TimerIO->tr_time.tv_secs=TIMEOUT;
  203.     TimerIO->tr_time.tv_micro=0;
  204.     
  205. #ifdef comm_debug
  206.     printf("Will send %d bytes:\n", length);
  207.     print_bytes(cb, length);
  208. #endif
  209.     
  210.     SendIO((struct IORequest *) TimerIO);
  211.     SendIO((struct IORequest *) SerialIO);
  212.     while (1) {
  213.         result=Wait(WaitMask);
  214.         if (CheckIO((struct IORequest *) SerialIO) ) {
  215.             WaitIO((struct IORequest *) SerialIO);
  216.             if (!CheckIO((struct IORequest *) TimerIO) ) AbortIO((struct IORequest *) TimerIO);
  217.             WaitIO((struct IORequest *) TimerIO);
  218. #ifdef comm_debug
  219.             printf("Send was ok\n\n");
  220. #endif
  221.             return;
  222.         }
  223.         if (CheckIO((struct IORequest *) TimerIO) ) {
  224.             // Timeout
  225.             WaitIO((struct IORequest *) TimerIO);
  226.             if (!CheckIO((struct IORequest *) SerialIO) )AbortIO((struct IORequest *) SerialIO);
  227.             WaitIO((struct IORequest *) SerialIO);
  228.             strcpy(error_msg, "timeout error");
  229.             return;
  230.         }
  231.         if (result & (SIGBREAKF_CTRL_C|SIGBREAKF_CTRL_F)) {
  232.             if (!CheckIO((struct IORequest *) SerialIO) )AbortIO((struct IORequest *) SerialIO);
  233.             WaitIO((struct IORequest *) SerialIO);
  234.             if (!CheckIO((struct IORequest *) TimerIO) ) AbortIO((struct IORequest *) TimerIO);
  235.             WaitIO((struct IORequest *) TimerIO);
  236.             strcpy(error_msg, "User sent CTRL_C or F");
  237.             return;
  238.         }
  239.     }
  240. }
  241.  
  242. __inline void send_L1(L1 b, char* error_msg) {
  243.     send(&b,1, error_msg);
  244. }
  245.  
  246. __inline void send_L2(L2 s, char* error_msg) {
  247.     L2 n;
  248.     
  249.     n=SetL2(s);
  250.     send((L1 *) &n, 2, error_msg);
  251. }
  252.  
  253. void read(L1 *cb, long max_size, char* error_msg) {
  254.     ULONG result;
  255.  
  256. #ifdef comm_debug
  257.     printf("Would like to receive %d bytes\n", max_size);
  258. #endif
  259.  
  260.     SerialIO->IOSer.io_Length  = max_size;
  261.     SerialIO->IOSer.io_Data    = (APTR) cb;
  262.     SerialIO->IOSer.io_Command = CMD_READ;
  263.  
  264.     TimerIO->tr_node.io_Command = TR_ADDREQUEST;
  265.     TimerIO->tr_time.tv_secs=TIMEOUT;
  266.     TimerIO->tr_time.tv_micro=0;
  267.  
  268.     SendIO((struct IORequest *) TimerIO);
  269.     SendIO((struct IORequest *) SerialIO);
  270.     
  271.     while (1) {
  272.         result=Wait(WaitMask);
  273.         if (CheckIO((struct IORequest *)SerialIO)) {
  274.             WaitIO((struct IORequest *) SerialIO);
  275.             if (!CheckIO((struct IORequest *) TimerIO) ) AbortIO((struct IORequest *) TimerIO);
  276.             WaitIO((struct IORequest *) TimerIO);
  277.             
  278. #ifdef comm_debug
  279.             printf("Received %d bytes:\n", SerialIO->IOSer.io_Actual);
  280.             print_bytes(cb, SerialIO->IOSer.io_Actual);
  281.             printf("\n");
  282. #endif
  283.             
  284.             if (SerialIO->IOSer.io_Actual!=max_size) {
  285.                 strcpy(error_msg, "Couldn't read enough");
  286.                 return;
  287.             }            
  288.             return;
  289.         }
  290.         
  291.         if (CheckIO((struct IORequest *) TimerIO) ){
  292.             // Timeout
  293.             WaitIO((struct IORequest *) TimerIO);
  294.             if (!CheckIO((struct IORequest *) SerialIO) )AbortIO((struct IORequest *) SerialIO);
  295.             WaitIO((struct IORequest *) SerialIO);
  296.             strcpy(error_msg, "timeout error");
  297.             return;
  298.         }
  299.          
  300.         if (result & (SIGBREAKF_CTRL_C|SIGBREAKF_CTRL_F)) {
  301.             if (!CheckIO((struct IORequest *) SerialIO) )AbortIO((struct IORequest *) SerialIO);
  302.             WaitIO((struct IORequest *) SerialIO);
  303.             if (!CheckIO((struct IORequest *) TimerIO) ) AbortIO((struct IORequest *) TimerIO);
  304.             WaitIO((struct IORequest *) TimerIO);
  305.             strcpy(error_msg, "User sent CTRL_C or F");
  306.             return;
  307.         }
  308.     }
  309. }
  310.  
  311. __inline void read_L1(L1 *v, char* error_msg) {
  312.     read(v, 1, error_msg);
  313.  
  314. __inline void read_L2(L2 *v, char* error_msg) {
  315.     read((L1 *) v, 2, error_msg);
  316.     *v=SetL2(*v);
  317. }
  318.  
  319. __inline void read_L4(L4 *v, char* error_msg) {
  320.     read((L1 *) v, 4, error_msg);
  321.     *v=SetL4(*v);
  322. }
  323.  
  324. __inline L2 checksum(L1 *start, L1 *end) {
  325.     L1 *i; L2 cs=0;
  326.     for (i=start; i<end; i++)
  327.         cs=cs+(L1) *i;
  328.  
  329.     return (L2) (cs &0xffff);
  330. }
  331.  
  332.  
  333. void SetIntegerRegister(enum Command_0 Register, L4 Value, char* error_msg) {
  334.     struct Command_0_Packet cmd;
  335.     L1 v; 
  336.     int retries;
  337.  
  338.     cmd.Packet_type=Packet_Command;
  339.     if (first_Packet) {
  340.         cmd.Packet_subtype=Packet_Subtype_First_Command;
  341.         first_Packet=0;
  342.     } else {
  343.         cmd.Packet_subtype=Packet_Subtype_Not_First_Command;
  344.     }
  345.     cmd.Length_of_data=SetL2(6);
  346.     cmd.Command_Code=0;
  347.     cmd.Register_Number=Register;
  348.     cmd.NewValue=SetL4(Value);
  349.     cmd.checksum=SetL2(checksum((L1 *) &(cmd.Command_Code), (L1 *) &(cmd.checksum)));
  350.  
  351. #ifdef debug
  352.     print_bytes((L1 *)&cmd, sizeof(struct Command_0_Packet));
  353. #endif
  354.  
  355.     retries=0;
  356.     while (retries<MAX_RETRIES) {
  357.         send((L1 *) &cmd, sizeof(struct Command_0_Packet), error_msg);
  358.         if (*error_msg!=0) return;
  359.         read_L1(&v, error_msg);
  360.         if (*error_msg!=0) return;
  361.         if (v==Camera_Positive_Achnowledgement) return;
  362.         else if (v==Camera_Unable_to_Execute_Command) retries++;
  363.         else {
  364. //            strcpy(error_msg, "Got unexpected data from camera");            // TetiSoft: No info
  365.             sprintf(error_msg, "Got unexpected data ($%08X) from camera", v);    // TetiSoft: More info
  366.             return;
  367.         }
  368.     }
  369. }
  370.  
  371.  
  372. void ReadIntegerRegister(enum Command_1 Register, L4 *value, char* error_msg) {
  373.     struct Command_1_Packet cmd;
  374.     L2 cs, ccs;
  375.     int retries=0;
  376.     L1 bb[10];
  377.     L4 *L4b;
  378.     
  379.     cmd.Packet_type=Packet_Command;
  380.     if (first_Packet) {
  381.         cmd.Packet_subtype=Packet_Subtype_First_Command;
  382.         first_Packet=0;
  383.     }
  384.     else {
  385.         cmd.Packet_subtype=Packet_Subtype_Not_First_Command;
  386.     }
  387.     
  388.     cmd.Length_of_data=0x0200;
  389.     cmd.Command_Code=0x01;
  390.     cmd.Register_Number=Register;
  391.     cmd.checksum=(Register+1)<<8;
  392.     
  393. #ifdef debug
  394.     print_bytes((L1 *) &cmd, sizeof(struct Command_1_Packet));
  395. #endif
  396.  
  397.     send((L1 *) &cmd, sizeof(struct Command_1_Packet), error_msg);
  398.     /* get packet */
  399.     while (retries<MAX_RETRIES) {
  400.         read(bb, 10, error_msg);
  401.         // check consistency;
  402.         
  403.         L4b=(L4 *) &bb[0];
  404.         if (*L4b!=0x03000400) {
  405. //            strcpy(error_msg, "Got unexpected data from camera");            // TetiSoft: No info
  406.             sprintf(error_msg, "Got unexpected data ($%08X) from camera", *L4b);    // TetiSoft: More info
  407.             return;
  408.         }
  409.         
  410.         *value= (L4) ((bb[7]<<24) + (bb[6]<<16) + (bb[5]<<8) + bb[4]);
  411.         cs=(L2) ((bb[9]<<8) + bb[8]);
  412.         ccs=(L4) (bb[4]+bb[5]+bb[6]+bb[7]);
  413.         if (cs!=ccs) {
  414.             printf("Checksum (=%x) is not calculated checksum (=%x)\n", cs, ccs);
  415.             retries++;
  416.             send_L1(Computer_Negative_Achnowledgement, error_msg);
  417.             if (*error_msg!=0) return;
  418.         } else {
  419.             send_L1(Computer_Positive_Achnowledgement, error_msg);
  420.             return; // return anyway
  421.         }
  422.     }
  423.     strcpy(error_msg, "Retry Error in ReadIntegerRegister()");
  424. }
  425.  
  426.  
  427. void TakeAction(enum Action_Code action, L1 arg, char* error_msg) {
  428.           /* struct and in this case struct Command_2_Packet has a special behavior.
  429.        When declaring an element, which takes more then one single byte
  430.        like L2 or L4, the structure will set the offset to an even number.
  431.        Example:
  432.  
  433.                 Offset:
  434.                         struct Command_2_Packet {
  435.                 0            L1 Packet_type;
  436.                 1            L1 Packet_subtype;
  437.                 2            L2 Length_of_data;
  438.  
  439.                 4            L1 Command_Code;
  440.                 5            L1 Action_Code;
  441.                 6            L1 single_byte;
  442.  
  443.                 8            L2 checksum;
  444.            }
  445.  
  446.              As You see, the offset 8 at checksum is an even address. So the
  447.       memory at offset 7 will not be used. 
  448.  
  449.       That is normaly no problem, as long as the structre is used in memory.
  450.       But in this case, the structre will be sent to the camera as a stream of
  451.       bytes. That means also the unused byte at offset 7 will be sent, which is
  452.       of course not part of the camera protocol. That's why I can't send it directly,
  453.              I have to send it in two parts (0..6 and 7..8).
  454.  
  455.              Why does the compiler this automatic offset changing? The reason is simple.
  456.       The 68000 family cpu (and mnay others too) can't access to odd addresses.
  457.       If You try, You will get an alert (=Guru message).
  458.     */
  459.  
  460.     struct Command_2_Packet cmd;
  461.     L1 bb[2]; L2 cs;
  462.  
  463.     cmd.Packet_type=Packet_Command;
  464.     if (first_Packet) {
  465.         cmd.Packet_subtype=Packet_Subtype_First_Command;
  466.         first_Packet=0;
  467.     } else {
  468.         cmd.Packet_subtype=Packet_Subtype_Not_First_Command;
  469.     }
  470.  
  471.     cmd.Length_of_data=0x0300;
  472.     cmd.Command_Code=0x02;
  473.     cmd.Action_Code=action;
  474.     if (action==AC_Set_Protection_State && arg!=0) cmd.single_byte=1;
  475.     else cmd.single_byte=0;
  476.     //cs=checksum((L1 *) &(cmd.Command_Code), (L1 *) (&(cmd.single_byte)+1));
  477.     cs=(2+action+cmd.single_byte);
  478.  
  479.     send((L1 *) &cmd, sizeof(struct Command_2_Packet)-3, error_msg);
  480.     if (*error_msg!=0) return;
  481.     send_L2(cs, error_msg);
  482.     if (*error_msg!=0) return;
  483.  
  484.     read(bb, 2, error_msg);
  485.     if (*error_msg!=0) return;
  486.     if (bb[0]!=Camera_Positive_Achnowledgement) {
  487.         strcpy(error_msg, "Error in TakeAction, no Camera ACK");
  488.         return;
  489.     }
  490.     if (bb[1]!=Camara_Action_Complete_Notification)
  491.         strcpy(error_msg, "Error in TakeAction, no action complete notification");
  492.     return;
  493. }
  494.  
  495.  
  496. void ReadVDataRegister(enum Command_4 Register, L1 *ret, L4 *total_size, char* error_msg) {
  497.     struct Command_4_Packet cmd;
  498.     L1 *bb, local_seq_number=0;
  499.     L2 size, cs, ccs;
  500.     int retry;
  501.     L1 minibuffer[4];
  502.     
  503.     bb=ret;
  504.     *total_size=0;
  505.     
  506.     cmd.Packet_type=Packet_Command;
  507.     if (first_Packet) {
  508.         cmd.Packet_subtype=Packet_Subtype_First_Command;
  509.         first_Packet=0;
  510.     }
  511.     else {
  512.         cmd.Packet_subtype=Packet_Subtype_Not_First_Command;
  513.     }
  514.     cmd.Length_of_data=0x0200;
  515.     cmd.Command_Code=4;
  516.     cmd.Register_Number=Register;
  517.     //cmd.checksum=SetL2(checksum((L1 *) &(cmd.Command_Code), (L1 *) &(cmd.checksum)));
  518.     cmd.checksum=(4+Register)<<8;
  519.  
  520.     send((L1 *) &cmd, sizeof(struct Command_4_Packet), error_msg);
  521.     if (*error_msg!=0) return;
  522.     
  523.     /* here, I should be able to receive one or many Data-Packages */
  524.     retry=0;
  525.     do {
  526.         read(minibuffer, 4, error_msg);
  527.         if (*error_msg!=0) return;
  528.         if (minibuffer[0]!=Packet_Last_in_Seq && minibuffer[0]!=Packet_Not_Last_in_Seq) {
  529.             strcpy(error_msg, "Got unexpected msg from camera in ReadVDataRegister()");
  530.             return;
  531.         }
  532.         
  533.         if (minibuffer[1]!=local_seq_number) {
  534.             strcpy(error_msg, "Packet seq doesn't match with internal seq");
  535.             return;
  536.         }
  537.  
  538.         size=(minibuffer[3]<<8) + minibuffer[2];
  539.         if (size>2048) {
  540.             strcpy(error_msg, "wrong size");
  541.             return;
  542.         }
  543.         if (retry==0) {
  544.             *total_size=*total_size+(L4) size;
  545.         }
  546.         read(bb, size+2, error_msg);
  547.         if (*error_msg!=0) return;
  548.         cs=(bb[size+1]<<8) + bb[size];
  549.         ccs=checksum((L1 *) bb, (L1 *) (bb+size));
  550.         if (cs!=ccs) {
  551.             printf("wrong checksum  (got=%x, calculated=%x)\n", cs, ccs);
  552.             retry++;
  553.         }
  554.         if (retry==0) {
  555.             /* send ACK */
  556.             send_L1(Computer_Positive_Achnowledgement, error_msg);
  557.             if (*error_msg!=0) return;
  558.             if (minibuffer[0]==Packet_Last_in_Seq) return;
  559.             bb+=size;
  560.             local_seq_number++;
  561.         
  562.         } else {
  563.             /* send NAK */
  564.             send_L1(Computer_Negative_Achnowledgement, error_msg);
  565.             if (*error_msg!=0) return;
  566.             retry=0;
  567.         }
  568.     } while (1);
  569. }
  570.  
  571. #ifdef comm_debug
  572.  
  573. void print_bytes(L1 *p, long len) {
  574.     long i, j, oldi;
  575.     
  576.     if (len<32) {
  577.         // print all
  578.         for (i=0;i<len;) {
  579.             oldi=i;
  580.             j=i+16;
  581.             if (j>len) j=len;
  582.             
  583.             for (;i<j;i++) {
  584.                 printf("%5d ", i);
  585.             }
  586.             printf("\n");
  587.             for (i=oldi;i<j;i++) {
  588.                 printf("%5x ", (int) p[i]);
  589.             }
  590.             printf("\n");
  591.         }
  592.         printf("\n\n");
  593.     } else {
  594.         // print two parts
  595.         
  596.         for (i=0;i<16;) {
  597.             oldi=i;
  598.             j=i+16;
  599.                         
  600.             for (;i<j;i++) {
  601.                 printf("%5d ", i);
  602.             }
  603.             printf("\n");
  604.             for (i=oldi;i<j;i++) {
  605.                 printf("%5x ", (int) p[i]);
  606.             }
  607.             printf("\n");
  608.         }
  609.         printf("\n");
  610.         
  611.         for (i=len-16;i<len;) {
  612.             oldi=i;
  613.             j=i+16;
  614.             if (j>len) j=len;
  615.             
  616.             for (;i<j;i++) {
  617.                 printf("%5d ", i);
  618.             }
  619.             printf("\n");
  620.             for (i=oldi;i<j;i++) {
  621.                 printf("%5x ", (int) p[i]);
  622.             }
  623.             printf("\n");
  624.         }
  625.         printf("\n\n");
  626.     }
  627. }
  628.  
  629. #endif
  630.  
  631. void save_Frame(int framenumber, char *name, char *comment, char* error_msg) {
  632.     BPTR file;
  633.     struct Command_4_Packet cmd;
  634.     L1 local_seq_number=0;
  635.     L2 size, cs, ccs;
  636.     int retry, not_all_read=1;
  637.     L1 minibuffer[4];
  638.     L1 buffer[2050];
  639.     
  640.     file=Open(name, MODE_NEWFILE);
  641.     if (file==NULL) {
  642.         strcpy(error_msg, "Couldn't open file");
  643.         return;
  644.     }
  645.     
  646.     SetIntegerRegister(Cmd_Set_Current_Frame_Number, (L1) framenumber, error_msg);
  647.     if (*error_msg!=0) {
  648.         Close(file);
  649.         DeleteFile(name);
  650.         return;
  651.     }
  652.     
  653.     // ask camera to send data
  654.  
  655.     cmd.Packet_type=Packet_Command;
  656.     if (first_Packet) {
  657.         cmd.Packet_subtype=Packet_Subtype_First_Command;
  658.         first_Packet=0;
  659.     }
  660.     else {
  661.         cmd.Packet_subtype=Packet_Subtype_Not_First_Command;
  662.     }
  663.     cmd.Length_of_data=0x0200;
  664.     cmd.Command_Code=4;
  665.     cmd.Register_Number=Cmd_Get_Current_Frame;
  666.     cmd.checksum=(4+Cmd_Get_Current_Frame)<<8;
  667.  
  668.     send((L1 *) &cmd, sizeof(struct Command_4_Packet), error_msg);
  669.     if (*error_msg!=0) {
  670.         printf("%s\n", error_msg);
  671.         Close(file);
  672.         DeleteFile(name);
  673.         strcpy(error_msg, "ReadVDRegister:Error during sending Packet");
  674.         return;
  675.     }
  676.  
  677.  
  678.     // read data and save them            
  679.     retry=0;
  680.     do {
  681.         // read a bit
  682.         read(minibuffer, 4, error_msg);
  683.         if (*error_msg!=0) {
  684.             Close(file);
  685.             DeleteFile(name);
  686.             return;
  687.         }
  688.  
  689.         if (minibuffer[0]!=Packet_Last_in_Seq && minibuffer[0]!=Packet_Not_Last_in_Seq) {
  690.             Close(file);
  691.             DeleteFile(name);
  692.             strcpy(error_msg, "Got unexpected msg from camera");
  693.             return;
  694.         }        
  695.         
  696.         if (minibuffer[1]!=local_seq_number) {
  697.             printf("Packet seq#=%d doesn't match with internal seq#%d\n", minibuffer[1], local_seq_number);
  698.             Close(file);
  699.             DeleteFile(name);
  700.             strcpy(error_msg, "Packet seq# doesn't match with internal seq#");
  701.             return;
  702.         }
  703.  
  704.         size=(minibuffer[3]<<8) + minibuffer[2];
  705.         if (size>2048) {
  706.             Close(file);
  707.             DeleteFile(name);
  708.             strcpy(error_msg, "wrong size (bigger then 2048");
  709.             return;
  710.         }
  711.         
  712.         read(buffer, size+2, error_msg);
  713.         if (*error_msg!=0) goto catch_save_Frame;
  714.         
  715.         cs=(buffer[size+1]<<8) + buffer[size];
  716.         ccs=checksum((L1 *) buffer, (L1 *) (buffer+size));
  717.         if (cs!=ccs) {
  718.             printf("wrong checksum  (got=%x, calculated=%x)\n", cs, ccs);
  719.             retry++;
  720.         }
  721.         if (retry==0) {
  722.             /* send ACK */
  723.             send_L1(Computer_Positive_Achnowledgement, error_msg);
  724.             if (*error_msg!=0) goto catch_save_Frame;
  725.             if (minibuffer[0]==Packet_Last_in_Seq) not_all_read=0;
  726.             local_seq_number++;
  727.         
  728.         } else {
  729.             /* send NAK */
  730.             send_L1(Computer_Negative_Achnowledgement, error_msg);
  731.             if (*error_msg!=0) goto catch_save_Frame;
  732.             retry=0;
  733.         }
  734.         goto skip_catch_save_Frame;
  735.     catch_save_Frame:
  736.         Close(file);
  737.         DeleteFile(name);
  738.         return;
  739.         
  740.     skip_catch_save_Frame:
  741.             
  742.         // save a bit    
  743.         if (-1==Write(file, (void *) buffer, size)) {
  744.             Close(file);
  745.             DeleteFile(name);
  746.             strcpy(error_msg, "Error during writing the file");
  747.             return;
  748.         }            
  749.     }
  750.     while (not_all_read!=0);
  751.     Close(file);
  752.     if (comment!=NULL) SetComment(name, comment);
  753.     return;
  754. }
  755.  
  756.  
  757. void save_Thumbnail(int framenumber, char *name, char *comment, char* error_msg) {
  758.  
  759.     long size=0;
  760.     long real_size=0;
  761.     L1* buffer;
  762.     BPTR file;
  763.     
  764.     Get_Length_of_Thumbnail(framenumber, &size, error_msg);
  765.     if (*error_msg!=0) return;
  766.     size=size+100; // to be sure
  767.     buffer=(L1 *)AllocMem(size, MEMF_CLEAR);
  768.     if (buffer==NULL) {
  769.         strcpy(error_msg, "not enough memory available");
  770.         return;
  771.     }
  772.     
  773.     file=Open(name, MODE_NEWFILE);
  774.     if (file==NULL) {
  775.         FreeMem(buffer, size);
  776.         strcpy(error_msg, "Couldn't open file");
  777.         return;
  778.     }
  779.         
  780.     SetIntegerRegister(Cmd_Set_Current_Frame_Number, (L1) framenumber, error_msg);
  781.     if (*error_msg!=0) {
  782.         Close(file);
  783.         DeleteFile(name);
  784.         FreeMem(buffer, size);
  785.         return;
  786.     }
  787.  
  788.     ReadVDataRegister(Cmd_Get_Current_Thumbnail, (L1 *) buffer, (L4 *) &real_size, error_msg);
  789.     if (*error_msg!=0) {
  790.         printf("%s\n", error_msg);
  791.         strcpy(error_msg, "An error occured in ReadVDataRegister(Cmd_Get_Current_Frame, (L1 *) buffer, size);\n");
  792.         Close(file);
  793.         DeleteFile(name);
  794.         FreeMem(buffer, size);
  795.         return;
  796.     }
  797.     if (-1==Write(file, (void *) buffer, real_size)) {
  798.         strcpy(error_msg, "Error during writing the file");
  799.         Close(file);
  800.         DeleteFile(name);
  801.         FreeMem(buffer, size);
  802.         return;
  803.     }
  804.     Close(file);
  805.     FreeMem(buffer, size);
  806.     if (comment!=NULL) SetComment(name, comment);
  807.     return;
  808. }
  809.  
  810.  
  811. void Set_Resolution(enum Resolution re, char* error_msg) {    // TetiSoft: Added enum
  812. //    int retries=0;    // TetiSoft: unused
  813.     MACRO_Set_Integer(Cmd_Set_Resolution, (L4) re, error_msg);
  814. }
  815.  
  816.  
  817. void Set_Clock(time_t c, char* error_msg) {
  818. //    int retries=0;    // TetiSoft: unused
  819.     MACRO_Set_Integer(Cmd_Set_Clock, (L4) c, error_msg);
  820. }
  821.  
  822.  
  823. void Set_Shutter_Speed(long ss, char* error_msg) {
  824. //    int retries=0;    // TetiSoft: unused
  825.     MACRO_Set_Integer(Cmd_Set_Shutter_Speed, (L4) ss, error_msg);
  826. }
  827.  
  828.  
  829. void Set_Aperture(enum Aperture a, char* error_msg) {
  830. //    int retries=0;    // TetiSoft: unused
  831.     MACRO_Set_Integer(Cmd_Set_Aperture, (L4) a, error_msg);
  832. }
  833.  
  834.  
  835. void Set_Color_Mode(enum Color_Mode cm, char* error_msg) {
  836. //    int retries=0;    // TetiSoft: unused
  837.     MACRO_Set_Integer(Cmd_Set_Color_Mode, (L4) cm, error_msg);
  838. }
  839.  
  840.  
  841. void Set_Flash_Mode(enum Flash_Mode fm, char* error_msg) {
  842. //    int retries=0;    // TetiSoft: unused
  843.     MACRO_Set_Integer(Cmd_Set_Flash_Mode, (L4) fm, error_msg);
  844. }
  845.  
  846.  
  847. void Set_Comm_Speed(enum Camera_Speed cs, char* error_msg) {
  848.     SetIntegerRegister(Cmd_Set_Comm_Speed, (L4) cs, error_msg);
  849.     if (*error_msg!=0) return;
  850.     Delay(5); // wait 0.5 seconds so camera can prepare for the change
  851.     SetSerialSpeed(cs, error_msg);
  852. }
  853.  
  854.  
  855. void Set_Bright_And_Contrast(enum Bright_Contrast bc, char* error_msg) {
  856. //    int retries=0;    // TetiSoft: unused
  857.     MACRO_Set_Integer(Cmd_Set_Bright_And_Contrast, (L4) bc, error_msg);
  858. }
  859.  
  860.  
  861. void Set_White_Balance(enum White_Balance wb, char* error_msg) {
  862. //    int retries=0;    // TetiSoft: unused
  863.     MACRO_Set_Integer(Cmd_Set_White_Balance, (L4) wb, error_msg);
  864. }
  865.  
  866.  
  867. void Set_Autoshut_on_Host_Timer(int aoht, char* error_msg) {
  868. //    int retries=0;    // TetiSoft: unused
  869.     MACRO_Set_Integer(Cmd_Set_Autoshut_on_Host_Timer, (L4) aoht, error_msg);
  870. }
  871.  
  872.  
  873. void Set_Autoshut_on_Field_Timer(int asoft, char* error_msg) {
  874. //    int retries=0;    // TetiSoft: unused
  875.     MACRO_Set_Integer(Cmd_Set_Autoshut_on_Field_Timer, (L4) asoft, error_msg);
  876. }
  877.  
  878.  
  879. void Set_LED(enum LED_Mode lm, char* error_msg) {
  880. //    int retries=0;    // TetiSoft: unused
  881.     MACRO_Set_Integer(Cmd_Set_LED, (L4) lm, error_msg);
  882. }
  883.  
  884.  
  885. void Set_Lens_Mode(enum Lens_Mode lm, char* error_msg) {
  886. //    int retries=0;    // TetiSoft: unused
  887.     MACRO_Set_Integer(Cmd_Set_Lens_Mode, (L4) lm, error_msg);
  888. }
  889.  
  890.  
  891. void Set_Date_Format(enum Date_Format df, char* error_msg) {
  892. //    int retries=0;    // TetiSoft: unused
  893.     MACRO_Set_Integer(Cmd_Set_Date_Format, (L4) df, error_msg);
  894. }
  895.  
  896.  
  897. void Set_Exp_Meter(enum Exp_Meter em, char* error_msg) {
  898. //    int retries=0;    // TetiSoft: unused
  899.     MACRO_Set_Integer(Cmd_Set_Exp_Meter, (L4) em, error_msg);
  900. }
  901.  
  902.  
  903. void Set_Optical_Mode(int AEL_WBL, int Fisheye, int Wide, int Digital_Zoom, int BAW, char* error_msg) {
  904.     L4 r=0;
  905. //    int retries=0;    // TetiSoft: unused
  906.     
  907.     if (AEL_WBL) r+=0x1;
  908.     if (Fisheye) r+=0x2;
  909.     if (Wide) r+=0x4;
  910.     if (Digital_Zoom) r+=0x8;
  911.     if (BAW) {r+=0x10;}    // TetiSoft: Added ;
  912.     
  913.     MACRO_Set_Integer(Cmd_Set_Optical_Mode, (L4) r, error_msg);
  914. }
  915.  
  916.  
  917. void Get_Resolution(enum Resolution *re, char* error_msg) {
  918.     L4 r;
  919. //    int retries=0;    // TetiSoft: unused
  920.     
  921.     MACRO_Get_FI_Integer(Cmd_Get_Resolution, error_msg);
  922.     if (*error_msg!=0) return;
  923.  
  924.     switch (r) {
  925.         case Standard_Resolution:
  926.         case High_Resolution:
  927.         case Extended_Resolution:
  928.             *re=(enum Resolution) r;    // TetiSoft: Added enum
  929.             return;
  930.         default:
  931.             *re=Unknown_Resolution;
  932.     }
  933. }
  934.  
  935.  
  936. void Get_Clock(time_t *c, char* error_msg) {
  937.     L4 r;
  938. //    int retries=0;    // TetiSoft: unused
  939.     
  940.     MACRO_Get_FI_Integer(Cmd_Get_Clock, error_msg);
  941.     *c=(time_t) r;
  942. }
  943.  
  944.  
  945. void Get_Shutter_Speed(long *ss, char* error_msg) {
  946.     L4 r;
  947. //    int retries=0;    // TetiSoft: unused
  948.     
  949.     MACRO_Get_FI_Integer(Cmd_Get_Shutter_Speed, error_msg);
  950.     *ss=(long) r;
  951. }
  952.  
  953.  
  954. void Get_Aperture(enum Aperture *a, char* error_msg) {
  955.     L4 r;
  956. //    int retries=0;    // TetiSoft: unused
  957.     
  958.     MACRO_Get_FI_Integer(Cmd_Get_Aperture, error_msg);
  959.  
  960.     switch (r) {
  961.         case Auto_Aperture:        // Added by TetiSoft
  962.         case Low_Aperture:
  963.         case Midium_Aperture:
  964.         case High_Aperture:
  965.             *a=(enum Aperture) r;    // TetiSoft: Added enum
  966.             break;
  967.         default:
  968.             *a=Unknown_Aperture;
  969.     }
  970. }
  971.  
  972.  
  973. void Get_Color_Mode(enum Color_Mode *cm, char* error_msg) {
  974.     L4 r;
  975. //    int retries=0;    // TetiSoft: unused
  976.     
  977.     MACRO_Get_FI_Integer(Cmd_Get_Color_Mode, error_msg);
  978.  
  979.     switch (r) {
  980.         case Color_Color_Mode:
  981.         case BAW_Color_Mode:
  982.             *cm=(enum Color_Mode) r;    // TetiSoft: Added enum
  983.             break;
  984.         default:
  985.             *cm=Unknown_Color_Mode;;
  986.     }
  987. }
  988.  
  989.  
  990. void Get_Flash_Mode(enum Flash_Mode *fm, char* error_msg) {
  991.     L4 r;
  992. //    int retries=0;    // TetiSoft: unused
  993.     
  994.     MACRO_Get_FI_Integer(Cmd_Get_Flash_Mode, error_msg);
  995.  
  996.     switch (r) {
  997.         case Auto_Flash_Mode:
  998.         case Force_Flash_Mode:
  999.         case Off_Flash_Mode:
  1000.         case Anti_Red_Eye_Flash_Mode:
  1001.         case Slow_Sync_Flash_Mode:
  1002.             *fm=(enum Flash_Mode) r;    // TetiSoft: Added enum
  1003.             break;
  1004.             
  1005.         default:
  1006.             *fm=Unknown_Flash_Mode;
  1007.     }
  1008. }
  1009.  
  1010.  
  1011. void Get_Num_of_Frames_Taken(int *noft, char* error_msg) {
  1012.     L4 r;
  1013. //    int retries=0;    // TetiSoft: unused
  1014.     
  1015.     MACRO_Get_FI_Integer(Cmd_Get_Num_of_Frames_Taken, error_msg);
  1016.     *noft=(int) r;
  1017. }
  1018.  
  1019.  
  1020. void Get_Num_of_Frames_Left(int *nofl, char* error_msg) {
  1021.     L4 r;
  1022. //    int retries=0;    // TetiSoft: unused
  1023.     
  1024.     MACRO_Get_FI_Integer(Cmd_Get_Num_of_Frames_Left, error_msg);
  1025.     *nofl=(int) r;
  1026. }
  1027.  
  1028.  
  1029. void Get_Length_of_Frame(int framenumber, long *length, char* error_msg) {
  1030.     L4 r=0;        // TetiSoft: initialised
  1031. //    int retries=0;    // TetiSoft: unused
  1032.     get_preview=0;
  1033.     
  1034.     MACRO_Get_FD_Integer(framenumber, Cmd_Get_Length_of_Current_Frame, error_msg);
  1035.     *length=(long) r;
  1036. }
  1037.  
  1038.  
  1039. void Get_Length_of_Thumbnail(int framenumber, long *length, char* error_msg) {
  1040.     L4 r=0;        // TetiSoft: initialised
  1041. //    int retries=0;    // TetiSoft: unused
  1042.     get_preview=0;
  1043.     
  1044.     MACRO_Get_FD_Integer(framenumber, Cmd_Get_Length_of_Current_Thumbnail, error_msg);
  1045.     *length=(long) r;
  1046. }
  1047.  
  1048.  
  1049. void Get_Battery_Capacity(int *bc, char* error_msg) {
  1050.     L4 r=0;        // TetiSoft: initialised
  1051. //    int retries=0;    // TetiSoft: unused
  1052.     
  1053.     MACRO_Get_FI_Integer(Cmd_Get_Battery_Capacity, error_msg);
  1054.     *bc=(int) r;
  1055. }
  1056.  
  1057.  
  1058. void Get_Comm_Speed(enum Camera_Speed *cs, char* error_msg) {
  1059.     L4 r;
  1060. //    int retries=0;    // TetiSoft: unused
  1061.     
  1062.     MACRO_Get_FI_Integer(Cmd_Get_Comm_Speed, error_msg);
  1063.     r=r& 0xff;
  1064.     switch(r) {
  1065.         case CAMERA_SPEED_9600:
  1066.         case CAMERA_SPEED_19200:
  1067.         case CAMERA_SPEED_38400:
  1068.         case CAMERA_SPEED_57600:
  1069.         case CAMERA_SPEED_115200:
  1070.         case CAMERA_SPEED_230400:        // Added by TetiSoft
  1071.             *cs=(enum Camera_Speed) r;    // TetiSoft: Added enum
  1072.             break;
  1073.         default:
  1074.             *cs=CAMERA_SPEED_Unknown;
  1075.     }
  1076. }
  1077.  
  1078.  
  1079. void Get_Bright_And_Contrast(enum Bright_Contrast *bc, char* error_msg) {
  1080.     L4 r;
  1081. //    int retries=0;    // TetiSoft: unused
  1082.     
  1083.     MACRO_Get_FI_Integer(Cmd_Get_Bright_And_Contrast, error_msg);
  1084.  
  1085.     switch(r) {
  1086.         case Normal_Bright_Contrast:
  1087.         case More_Bright_Bright_Contrast:
  1088.         case Less_Bright_Bright_Contrast:
  1089.         case More_Contrast_Bright_Contrast:
  1090.         case Less_Contrast_Bright_Contrast:
  1091.             *bc=(enum Bright_Contrast) r;    // TetiSoft: Added enum
  1092.             break;
  1093.         
  1094.         default:
  1095.             *bc=Unknown_Bright_Contrast;
  1096.             break;
  1097.     }
  1098. }
  1099.  
  1100.  
  1101. void Get_White_Balance(enum White_Balance *wb, char* error_msg) {
  1102.     L4 r;
  1103. //    int retries=0;    // TetiSoft: unused
  1104.     
  1105.     MACRO_Get_FI_Integer(Cmd_Get_White_Balance, error_msg);
  1106.     
  1107.     switch(r) {
  1108.         case Auto_White_Balance:
  1109.         case Skylight_White_Balance:
  1110.         case Fluoresent_White_Balance:
  1111.         case Thungsten_White_Balance:
  1112.         case Cloudy_White_Balance:
  1113.             *wb=(enum White_Balance) r;    // TetiSoft: Added enum
  1114.             break;
  1115.         
  1116.         default:
  1117.             *wb=Unknown_White_Balance;
  1118.             break;
  1119.     }
  1120. }
  1121.  
  1122.  
  1123. void Get_Autoshut_on_Host_Timer(int *asoht, char* error_msg) {
  1124.     L4 r;
  1125. //    int retries=0;    // TetiSoft: unused
  1126.     
  1127.     MACRO_Get_FI_Integer(Cmd_Get_Autoshut_on_Field_Timer, error_msg);
  1128.     *asoht=(int) r;
  1129. }
  1130.  
  1131.  
  1132. void Get_Autoshut_on_Field_Timer(int *asoft, char* error_msg) {
  1133.     L4 r;
  1134. //    int retries=0;    // TetiSoft: unused
  1135.     
  1136.     MACRO_Get_FI_Integer(Cmd_Get_Autoshut_on_Field_Timer, error_msg);
  1137.     *asoft=(int) r;
  1138. }
  1139.  
  1140.  
  1141. void Get_Available_Memory_Left(long *aml, char* error_msg) {
  1142.     L4 r;
  1143. //    int retries=0;    // TetiSoft: unused
  1144.     
  1145.     MACRO_Get_FI_Integer(Cmd_Get_Available_Memory_Left, error_msg);
  1146.     *aml=(int) r;
  1147. }
  1148.  
  1149.  
  1150. void Get_Lens_Mode(enum Lens_Mode *lm, char* error_msg) {
  1151.     L4 r;
  1152. //    int retries=0;    // TetiSoft: unused
  1153.  
  1154.     MACRO_Get_FI_Integer(Cmd_Get_Lens_Mode, error_msg);
  1155.  
  1156.     switch(r) {
  1157.         case Macro_Lens_Mode:
  1158.         case Normal_Lens_Mode:
  1159.         case Infinity_Fisheye_Lens_Mode:
  1160.             *lm=(enum Lens_Mode) r;    // TetiSoft: Added enum
  1161.             break;
  1162.         
  1163.         default:
  1164.             *lm=Unknown_Lens_Mode;
  1165.             break;
  1166.     }
  1167. }
  1168.  
  1169. void Get_LCD_Brightness(int *lb, char* error_msg) {
  1170.     L4 r;
  1171. //    int retries=0;    // TetiSoft: unused
  1172.     
  1173.     MACRO_Get_FI_Integer(Cmd_Get_LCD_Brightness, error_msg);
  1174.     *lb=(int) r;
  1175. }
  1176.  
  1177.  
  1178. void Get_LCD_Autoshut_Timer(int *lat, char* error_msg) {
  1179.     L4 r;
  1180. //    int retries=0;    // TetiSoft: unused
  1181.     
  1182.     MACRO_Get_FI_Integer(Cmd_Get_LCD_Autoshut_Timer, error_msg);
  1183.     *lat=(int) r;
  1184. }
  1185.  
  1186.  
  1187. void Get_Protect_State_of_Frame(int framenumber, int *psof, char* error_msg) {
  1188.     L4 r=0;        // TetiSoft: initialised
  1189. //    int retries=0;    // TetiSoft: unused
  1190.     get_preview=0;
  1191.     
  1192.     MACRO_Get_FD_Integer(framenumber, Cmd_Get_Protect_State_of_Current_Frame, error_msg);
  1193.     *psof=(int) r;
  1194. }
  1195.  
  1196.  
  1197. void Get_Date_Format(enum Date_Format *df, char* error_msg) {
  1198.     L4 r;
  1199. //    int retries=0;    // TetiSoft: unused
  1200.     
  1201.     MACRO_Get_FI_Integer(Cmd_Get_Date_Format, error_msg);
  1202.  
  1203.     switch(r) {
  1204.         case YY_MM_DD_Date_Format:
  1205.         case DD_MM_HH_Date_Format:
  1206.         case DD_P_MM_P_Date_Format:        // Added by TetiSoft
  1207.             *df=(enum Date_Format) r;    // TetiSoft: Added enum
  1208.             break;
  1209.         
  1210.         default:
  1211.             *df=Unknown_Date_Format;
  1212.             break;
  1213.     }
  1214. }
  1215.  
  1216.  
  1217. void Get_Exp_Meter(enum Exp_Meter *em, char* error_msg) {
  1218.     L4 r;
  1219. //    int retries=0;    // TetiSoft: unused
  1220.     
  1221.     MACRO_Get_FI_Integer(Cmd_Get_Exp_Meter, error_msg);
  1222.  
  1223.     switch(r) {
  1224.         case Center_weighted_Exp_Meter:
  1225.         case Spot_Exp_Meter:
  1226.         case Multi_Element_Matrix_Exp_Meter:
  1227.             *em=(enum Exp_Meter) r;    // TetiSoft: Added enum
  1228.             break;
  1229.         
  1230.         default:
  1231.             *em=Unknown_Exp_Meter;
  1232.             break;
  1233.     }
  1234. }
  1235.  
  1236.  
  1237. void Get_Optical_Mode(int *AEL_WBL, int *Fisheye, int *Wide, int *Digital_Zoom, int *BAW, char* error_msg) {
  1238.     L4 r;
  1239. //    int retries=0;    // TetiSoft: unused
  1240.     
  1241.     MACRO_Get_FI_Integer(Cmd_Get_Optical_Mode, error_msg);
  1242.     
  1243.     *AEL_WBL=(r & 0x1);
  1244.     *Fisheye=(r & 0x2);
  1245.     *Wide=(r & 0x4);
  1246.     *Digital_Zoom=(r & 0x8);
  1247.     *BAW=(r & 0x10);
  1248. }
  1249.  
  1250.  
  1251. void Get_Frame(int framenumber, UBYTE *buffer, long *size, char* error_msg) {
  1252. //    int retries=0;    // TetiSoft: unused
  1253.     get_preview=0;
  1254.     
  1255.     MACRO_Get_FD_VData(framenumber, Cmd_Get_Current_Frame, buffer, size, error_msg);
  1256. }
  1257.  
  1258.  
  1259. void Get_Thumbnail(int framenumber, UBYTE *buffer, long *size, char* error_msg)  {
  1260. //    int retries=0;    // TetiSoft: unused
  1261.     get_preview=0;
  1262.     
  1263.     MACRO_Get_FD_VData(framenumber, Cmd_Get_Current_Thumbnail, buffer, size, error_msg);
  1264. }
  1265.  
  1266.  
  1267. void Get_Camera_ID(UBYTE *buffer, long *size, char* error_msg) {
  1268. //    int retries=0;    // TetiSoft: unused
  1269.         
  1270.     MACRO_Get_FI_VData(Cmd_Get_Camera_ID, buffer, size, error_msg);
  1271. }
  1272.  
  1273.  
  1274. void Get_Serial_Number(UBYTE *buffer, long *size, char* error_msg) {
  1275. //    int retries=0;    // TetiSoft: unused
  1276.     
  1277.     MACRO_Get_FI_VData(Cmd_Get_Serial_Number, buffer, size, error_msg);
  1278. }
  1279.  
  1280.  
  1281. void Get_Version(UBYTE *buffer, long *size, char* error_msg) {
  1282. //    int retries=0;    // TetiSoft: unused
  1283.     
  1284.     MACRO_Get_FI_VData(Cmd_Get_Version, buffer, size, error_msg);
  1285. }
  1286.  
  1287.  
  1288. void Get_Model(char *string, long *size, char* error_msg) {
  1289. //    int retries=0;    // TetiSoft: unused
  1290.     
  1291.     MACRO_Get_FI_VData(Cmd_Get_Model, string, size, error_msg);
  1292. }
  1293.  
  1294.  
  1295. /* not supported by many cameras */
  1296. void Get_Audio_Data(UBYTE *buffer, long *size, char* error_msg) {
  1297. //    int retries=0;    // TetiSoft: unused
  1298.  
  1299.     MACRO_Get_FI_VData(Cmd_Get_Audio_Data, buffer, size, error_msg);
  1300. }
  1301.  
  1302.  
  1303. void Get_Camera_Summery_Data(enum Resolution *re, int *LCD_Brightness, int *Frames_Taken, char* error_msg) {
  1304. //    int retries=0;        // TetiSoft: unused
  1305.     L4 buffer[1024];    // TetiSoft: Increased buffer (was 8)
  1306.     long sizeVal;        // Added by TetiSoft
  1307.     long *size=&sizeVal;    // TetiSoft: Fixed NULL init
  1308.         
  1309.     MACRO_Get_FI_VData(Cmd_Get_Camera_Summery_Data, buffer, size, error_msg);
  1310.  
  1311.     *re=(enum Resolution)SetL4(buffer[0]);    // TetiSoft: Added enum
  1312.     *LCD_Brightness=(int)SetL4(buffer[1]);
  1313.     *Frames_Taken=(int) SetL4(buffer[2]);
  1314. }
  1315.  
  1316.  
  1317. void Get_Picture_Summery_Data(int framenumber, long *AudioDataLength, enum Resolution *re, int *ProtectionState, time_t *TimeDate, char* error_msg) {
  1318. //    int retries=0;        // TetiSoft: unused
  1319.     L4 buffer[1024]={0};    // TetiSoft: Increased buffer (was 8), initialised it
  1320.     long sizeVal=0;        // Added by TetiSoft
  1321.     long *size=&sizeVal;    // TetiSoft: Fixed NULL init
  1322.     get_preview=0;
  1323.     
  1324.     MACRO_Get_FD_VData(framenumber, Cmd_Get_Picture_Summery_Data, buffer, size, error_msg);
  1325.     if (*error_msg!=0) return;
  1326.  
  1327.     if ((*size)<20) {
  1328.         strcpy(error_msg, "wrong size of data packet");
  1329.         return;
  1330.     }
  1331.     *AudioDataLength=(long)SetL4(buffer[2]);
  1332.  
  1333.     switch(SetL4(buffer[3])) {
  1334.         case Standard_Resolution:
  1335.         case High_Resolution:
  1336.         case Extended_Resolution:
  1337.             *re=(enum Resolution)SetL4(buffer[3]);    // TetiSoft: Added enum
  1338.             break;
  1339.     
  1340.         default:
  1341.             *re=Unknown_Resolution;
  1342.             break;
  1343.     }
  1344.  
  1345.     *ProtectionState=(int) SetL4(buffer[4]);
  1346.     *TimeDate=(time_t) SetL4(buffer[5]);
  1347.  
  1348. }
  1349.  
  1350.  
  1351. void Get_Manufacturer(char *string, long *size, char* error_msg) {
  1352. //    int retries=0;    // TetiSoft: unused
  1353.     
  1354.     MACRO_Get_FI_VData(Cmd_Get_Manufacturer, string, size, error_msg);
  1355. }
  1356.  
  1357.  
  1358. void Get_Preview(UBYTE *buffer, long *size, char* error_msg)  {
  1359.     
  1360.     
  1361.     TakeAction(AC_Take_Preview_Snapshot, 0, error_msg);
  1362.     if (*error_msg!=0) {
  1363.         printf("%s\n", error_msg);
  1364.         strcpy(error_msg, "An error occured in TakeAction(AC_Take_Preview_Snapshot, 0);");
  1365.         return;
  1366.     }
  1367.     
  1368.     if (get_preview==0) {
  1369.     
  1370.         SetIntegerRegister(Cmd_Set_Current_Frame_Number, (L1) 0, error_msg);
  1371.         if (*error_msg!=0) {
  1372.             printf("%s\n", error_msg);
  1373.             strcpy(error_msg, "An error occured in SetIntegerRegister(Cmd_Set_Current_Frame_Number, (L1) 0);");
  1374.             return;
  1375.         }
  1376.     }
  1377.     
  1378.     get_preview=1;
  1379.     
  1380.     ReadVDataRegister(Cmd_Get_Current_Frame, (L1 *) buffer, (L4 *) size, error_msg);
  1381.     if (*error_msg!=0) {
  1382.         printf("%s\n", error_msg);
  1383.         strcpy(error_msg, "An error occured in ReadVDataRegister(Cmd_Get_Current_Frame, (L1 *) buffer, size);\n");
  1384.     }
  1385.     return;
  1386. }
  1387.  
  1388.  
  1389. char* dump_Resolution(enum Resolution r) {
  1390.     switch (r) {
  1391.         case Standard_Resolution:
  1392.             return "Standard";
  1393.         
  1394.         case High_Resolution:
  1395.             return "High";
  1396.         
  1397.         case Extended_Resolution:
  1398.             return "Extended";
  1399.         
  1400.         default:
  1401.             return "Unknown";
  1402.     }
  1403. }
  1404.  
  1405.  
  1406. char* dump_Aperture(enum Aperture a) {
  1407.     switch(a) {
  1408.         case Auto_Aperture:    // Added by TetiSoft
  1409.             return "Auto";    // Added by TetiSoft
  1410.  
  1411.         case Low_Aperture:
  1412.             return "Low";
  1413.         
  1414.         case Midium_Aperture:
  1415.             return "Midium";
  1416.         
  1417.         case High_Aperture:
  1418.             return "High";
  1419.         
  1420.         default:
  1421.             return "Unknown";
  1422.     }
  1423. }
  1424.  
  1425.  
  1426. char* dump_Color_Mode(enum Color_Mode cm) {
  1427.     switch(cm) {
  1428.         case Color_Color_Mode:
  1429.             return "Color";
  1430.         
  1431.         case BAW_Color_Mode:
  1432.             return "B&W";
  1433.         
  1434.         default:
  1435.             return "Unknown";
  1436.     }
  1437. }
  1438.  
  1439.  
  1440. char* dump_Flash_Mode(enum Flash_Mode fm) {
  1441.     switch(fm) {
  1442.         case Auto_Flash_Mode:
  1443.             return "Auto";
  1444.         
  1445.         case Force_Flash_Mode:
  1446.             return "Force";
  1447.             
  1448.         case Off_Flash_Mode:
  1449.             return "Off";
  1450.         
  1451.         case Anti_Red_Eye_Flash_Mode:
  1452.             return "Anti_Red_Eye";
  1453.         
  1454.         case Slow_Sync_Flash_Mode:
  1455.             return "Slow_Sync";
  1456.             
  1457.         default:
  1458.             return "Unknown";
  1459.     }
  1460. }    
  1461.  
  1462.  
  1463. char* dump_Camera_Speed(enum Camera_Speed cs) {
  1464.     switch (cs) {
  1465.         case CAMERA_SPEED_INIT:
  1466.             return "init-speed (=19200)";
  1467.         
  1468.         case CAMERA_SPEED_9600:
  1469.             return "9600";
  1470.             
  1471.         case CAMERA_SPEED_19200:
  1472.             return "19200";
  1473.         
  1474.         case CAMERA_SPEED_38400:
  1475.             return "38400";
  1476.         
  1477.         case CAMERA_SPEED_57600:
  1478.             return "57600";
  1479.         
  1480.         case CAMERA_SPEED_115200:
  1481.             return "115200";
  1482.             
  1483.         case CAMERA_SPEED_230400:    // Added by TetiSoft
  1484.             return "230400";    // Added by TetiSoft
  1485.             
  1486.         default:
  1487.             return "Unknown";
  1488.     }
  1489. }
  1490.  
  1491.  
  1492. char* dump_Bright_Contrast(enum Bright_Contrast bc) {
  1493.     switch (bc) {
  1494.         case Normal_Bright_Contrast:
  1495.             return "Normal_Bright";
  1496.         
  1497.         case More_Bright_Bright_Contrast:
  1498.             return "More_Bright";
  1499.         
  1500.         case Less_Bright_Bright_Contrast:
  1501.             return "Less_Bright";
  1502.             
  1503.         case More_Contrast_Bright_Contrast:
  1504.             return "More_Contrast";
  1505.         
  1506.         case Less_Contrast_Bright_Contrast:
  1507.             return "Less_Contrast";
  1508.             
  1509.         default:
  1510.             return "Unknown";
  1511.     }
  1512. }
  1513.  
  1514.  
  1515. char* dump_White_Balance(enum White_Balance wb) {
  1516.     switch (wb) {
  1517.         case Auto_White_Balance:
  1518.             return "Auto";
  1519.         
  1520.         case Skylight_White_Balance:
  1521.             return "Skylight";
  1522.         
  1523.         case Fluoresent_White_Balance:
  1524.             return "Fluoresent";
  1525.         
  1526.         case Thungsten_White_Balance:
  1527.             return "Thungsten";
  1528.         
  1529.         case Cloudy_White_Balance:
  1530.             return "Cloudy";
  1531.         
  1532.         default:
  1533.             return "Unknown";
  1534.     }
  1535. }
  1536.  
  1537.  
  1538. char* dump_Lens_Mode(enum Lens_Mode lm) {
  1539.     switch (lm) {
  1540.         case Macro_Lens_Mode:
  1541.             return "Macro";
  1542.         
  1543.         case Normal_Lens_Mode:
  1544.             return "Normal";
  1545.         
  1546.         case Infinity_Fisheye_Lens_Mode:
  1547.             return "Infinity_Fisheye";
  1548.         
  1549.         default:
  1550.             return "Unknown";
  1551.     }
  1552. }
  1553.  
  1554.  
  1555. char* dump_Date_Format(enum Date_Format df) {
  1556.     switch (df) {
  1557.         case YY_MM_DD_Date_Format:
  1558.             return "YY MM DD";
  1559.  
  1560.         case DD_MM_HH_Date_Format:
  1561.             return "DD MM HH";
  1562.  
  1563.         case DD_P_MM_P_Date_Format:    // Added by TetiSoft
  1564.             return "D. M. 'YY";    // Added by TetiSoft
  1565.         
  1566.         default:
  1567.             return "Unknown";
  1568.     }
  1569. }
  1570.  
  1571.  
  1572. char* dump_Exp_Meter(enum Exp_Meter em) {
  1573.     switch (em) {
  1574.         case Center_weighted_Exp_Meter:
  1575.             return "Center_weighted";
  1576.         
  1577.         case Spot_Exp_Meter:
  1578.             return "Spot";
  1579.         
  1580.         case Multi_Element_Matrix_Exp_Meter:
  1581.             return "Multi_Element_Matrix";
  1582.         
  1583.         default:
  1584.             return "Unknown";
  1585.     }
  1586. }
  1587.  
  1588.  
  1589. char* dump_LED_Mode(enum LED_Mode lm) {
  1590.     switch (lm) {
  1591.         case Off_LED_Mode:
  1592.             return "Off";
  1593.         
  1594.         case On_LED_Mode:
  1595.             return "On";
  1596.         
  1597.         case Blink_LED_Mode:
  1598.             return "Blink";
  1599.         
  1600.         default:
  1601.             return "Unknown";
  1602.     }
  1603. }
  1604.